#​ 默认独立​​：每个阶段从零开始，互不影响。
# ​可控共享​​：通过 COPY --from 按需传递必要文件，实现跨阶段协作。
#​ 最终镜像最简​​：仅包含运行时所需内容，消除冗余。
# 安全性:生产镜像不包含开发工具（如 TypeScript、Webpack）或源代码，减少攻击面
# 性能​:仅最终阶段的内容会被保留，中间阶段的临时文件（如 node_modules、源代码）自动丢弃，缩小镜像体积。

# 阶段 1: 安装开发依赖（用于构建）
FROM node:22-alpine AS development-dependencies-env
# 仅复制依赖声明文件
COPY ./package.json package-lock.json /app/
WORKDIR /app
# 精准安装（包括开发依赖）
RUN npm ci 

# 阶段 2: 安装生产依赖
FROM node:22-alpine AS production-dependencies-env
COPY ./package.json package-lock.json /app/
WORKDIR /app
# 仅安装生产依赖
RUN npm ci --omit=dev  

# 阶段 3: 构建应用
FROM node:22-alpine AS build-env
# 复制全部源代码
COPY . /app/ 
# 复用开发依赖
COPY --from=development-dependencies-env /app/node_modules /app/node_modules 
WORKDIR /app
# 执行构建命令
RUN npm run build 

# 阶段 4: 生产镜像
FROM node:22-alpine AS production-node
# 复制依赖声明文件
COPY ./package.json package-lock.json /app/   
# 复用生产依赖
COPY --from=production-dependencies-env /app/node_modules /app/node_modules 
# 复制构建产物
COPY --from=build-env /app/build /app/build 
WORKDIR /app
# 启动应用
# CMD ["npm", "run", "start"] 

# 阶段 5: 集成 Nginx 反向代理
# Nginx镜像中不应该添加nodejs,改用​​docker-compose.yml,除非只代理静态资源
FROM nginx:alpine
# 复制 Nginx 配置文件
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
# 从 production-node 阶段复制 Node 应用
COPY --from=production-node /app /app
# 安装 Node.js 运行时（Alpine 镜像中需手动安装）
RUN apk add --no-cache nodejs
RUN apk add --no-cache npm

# 安装 PM2（可选）
RUN npm install -g pm2

# 设置启动脚本
# COPY ./start.sh /app/
# RUN chmod +x /app/start.sh
# 暴露端口（Nginx 默认 80，Node 3000）
EXPOSE 80

ENV NODE_TLS_REJECT_UNAUTHORIZED=0

WORKDIR /app


CMD ["sh", "-c", "pm2-runtime start npm --name 'react-router-v7' -- start &amp; nginx -g 'daemon off;'"] 

# 使用启动脚本
# CMD ["./start.sh"] 

# 使用npm start
#CMD ["sh", "-c", "npm start &amp; nginx -g 'daemon off;'"]
#CMD ["sh", "-c", "./node_modules/.bin/react-router-serve ./build/server/index.js &amp; nginx -g 'daemon off;'"]